<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
</body>
</html>

<script>
  // 函数是 js 数据类型中的一种复杂数据类型也叫引用数据类型
  // function fn() {
  //   console.log(123);
  // }
  // var fn = function() {
  //   console.log(123);
  // }
  // console.log(typeof fn);
  // 但是用typeof方法检测出来的函数的数据类型是function



  
  // 定义函数
  // 声明（定义）函数时括号中的变量叫做形参
  // 形参就是在函数内部可以使用的变量，在函数外部不能使用
  // 每写一个单词，就相当于在函数内部定义了一个可以使用的变量(遵循变量名的命名规则和命名规范)
  // 多个单词之间以 `,` 分隔
  // 如果只有行参的话，那么在函数内部使用的值个变量是没有值的，也就是 `undefined`
  // 行参的值是在函数调用的时候由实参决定的
  // 多个参数的时候，是按照顺序一一对应的
  function isPrime(n) {
    var flag = false;
    for (var i = 2; i < n; i++) {
      if (n % i === 0) {
        flag = true;
        break;
      }
    }
    var result = flag ? "不是质数" : "是质数";
    console.log(n + result);
  }
  // 调用函数
  // 调用函数时括号中的数据为实参
  // 实参是专门为形参赋值的
  isPrime(153);
  isPrime(179);
  isPrime(189);




  // 画一个9*9的表格
  function drawTable(row, column, content) {
    document.write("<table border='1'>");
    for (var i = 1; i <= row; i++) {
      document.write("<tr>")
      for (var j = 1; j <= column; j++) {
          document.write(`<td>${content}</td>`)
        }
        document.write("</tr>")
      }
    document.write("</table>");
  }
  drawTable(5, 3, "abc");
  drawTable(6, 6, "xyz");





  // 1) 形参比实参少
  // - 因为是按照顺序一一对应的
  // - 形参少就会拿不到实参给的值，所以在函数内部就没有办法用到这个值

  // 2) 形参比实参多
  // - 因为是按照顺序一一对应的
  // - 所以多出来的形参就是没有值的，就是 `undefined`
  function fn(a, b) {
    console.log(a, b);
  }
  fn(5, 6);
  fn(7);
  fn();
  fn(1, 2, 3)






  // 要求写一个函数fn2，要求fn2(3,4)输出7，fn2(5,8)输出13
  function fn2(a, b) {
    console.log(a + b);
  }
  fn2(3, 4) // 7
  fn2(5, 8) // 13



  // 写一个传入一个数字，求这个数字的阶乘的函数
  // 可以在函数参数的位置加等号，就相当于是函数的默认值
  function factorial(n = 1) {
    // if (n === undefined) {
    //   n = 1;
    // }

    // n || (n = 1);

    // n = n || 1;

    for (var i = 1,result = 1; i <= n; i++) {
      result *= i;
    }
    console.log(result);
  }
  factorial(5); // 5!
  factorial(8); // 8!
  factorial(); // 1!

</script>